home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 2 / Meeting Pearls Vol. II (1995)(GTI - Schatztruhe)[!].iso / Pearls / dev / Oberon_Sources / OOP_in_Oberon-2 / FoldElems0.mod < prev    next >
Text File  |  1993-01-13  |  3KB  |  78 lines

  1. MODULE FoldElems0;   (*HM Mar-25-92*)
  2. IMPORT OS, Texts0, TextFrames0, Viewers0;
  3. CONST
  4.         colLeft* = 0; colRight* = 1; expRight* = 2; expLeft* = 3;
  5. TYPE
  6.         Element* = POINTER TO ElemDesc;
  7.         ElemDesc* = RECORD (Texts0.ElemDesc)
  8.                 mode-: INTEGER;
  9.                 hidden: Texts0.Text
  10.         END;
  11. VAR
  12.         pat: ARRAY 4 OF OS.Pattern;
  13.         eW, eH: INTEGER;
  14. PROCEDURE Twin (e: Texts0.Element; t: Texts0.Text; VAR pos: LONGINT): Element;
  15.         VAR level: INTEGER;
  16. BEGIN
  17.         t.SetPos(pos + 1); level := 1;
  18.         LOOP t.ReadNextElem(e); pos := t.pos - 1;
  19.                 IF e = NIL THEN RETURN NIL
  20.                 ELSIF e IS Element THEN
  21.                         IF e(Element).mode IN {expLeft, colLeft} THEN INC(level) ELSE DEC(level) END;
  22.                         IF level = 0 THEN RETURN e(Element) END
  23.                 END
  24.         END
  25. END Twin;
  26. PROCEDURE (e: Element) Copy* (): Texts0.Element;
  27.         VAR x: Element;
  28. BEGIN NEW(x); x.w := e.w; x.h := e.h; x.dsc := e.dsc; x.mode := e.mode;
  29.         IF e.hidden # NIL THEN NEW(x.hidden); x.hidden.Clear; x.hidden.Insert(0, e.hidden, 0, e.hidden.len) END;
  30.         RETURN x
  31. END Copy;
  32. PROCEDURE (e: Element) Draw* (x, y: INTEGER);
  33. BEGIN OS.DrawPattern(pat[e.mode], x + 2, y - e.dsc)
  34. END Draw;
  35. PROCEDURE (e: Element) HandleMouse* (f: OS.Object; x, y: INTEGER);
  36.         VAR buttons: SET; e1: Element; t: Texts0.Text; pos, pos1, len1: LONGINT; m: Texts0.NotifyReplMsg;
  37. BEGIN REPEAT OS.GetMouse(buttons, x, y) UNTIL buttons = {};
  38.         WITH f: TextFrames0.Frame DO
  39.                 IF e.mode IN {expLeft, colLeft} THEN
  40.                         pos := f.text.ElemPos(e); pos1 := pos; e1 := Twin(e, f.text, pos1); len1 := e.hidden.len;
  41.                         NEW(t); t.Clear; t.Insert(0, f.text, pos + 1, pos1); f.text.Delete(pos + 1, pos1); 
  42.                         f.text.Insert(pos + 1, e.hidden, 0, e.hidden.len); e.hidden := t;
  43.                         e.mode := 3 - e.mode; e1.mode := 3 - e1.mode;
  44.                         m.t := f.text; m.beg := pos; m.end := pos + len1 + 1; Viewers0.Broadcast(m)
  45.                 END
  46.         END
  47. END HandleMouse;
  48. PROCEDURE (e: Element) Load* (VAR r: OS.Rider);
  49.         VAR x: OS.Object;
  50. BEGIN e.Load^ (r); r.ReadInt(e.mode); r.ReadObj(x);
  51.         IF x # NIL THEN e.hidden := x(Texts0.Text) END
  52. END Load;
  53. PROCEDURE (e: Element) Store* (VAR r: OS.Rider);
  54. BEGIN e.Store^ (r); r.WriteInt(e.mode); r.WriteObj(e.hidden)
  55. END Store;
  56. PROCEDURE Insert*;
  57.         VAR f: TextFrames0.Frame; e: Element; beg, end: LONGINT;
  58. BEGIN TextFrames0.GetSelection(f);
  59.         IF f # NIL THEN beg := f.selBeg.pos; end := f.selEnd.pos;
  60.                 NEW(e); e.mode := expRight; e.w := eW; e.h := eH; e.dsc := 0;
  61.                 f.text.SetPos(end); f.text.WriteElem(e);
  62.                 NEW(e); e.mode := expLeft; e.w := eW; e.h := eH; e.dsc := 0; NEW(e.hidden); e.hidden.Clear;
  63.                 f.text.SetPos(beg); f.text.WriteElem(e)
  64.         END
  65. END Insert;
  66. PROCEDURE Init;
  67.         VAR fnt: OS.Font; dx, x, y, w, h: INTEGER;
  68. BEGIN
  69.         fnt := OS.FontWithName("Syntax10.Scn.Fnt");
  70.         OS.GetCharMetric(fnt, 1BX, dx, x, y, w, h, pat[0]);     (*collapsed open*)
  71.         OS.GetCharMetric(fnt, 1FX, dx, x, y, w, h, pat[1]);     (*collapsed close*)
  72.         OS.GetCharMetric(fnt, 1EX, dx, x, y, w, h, pat[2]);     (*expanded close*)
  73.         OS.GetCharMetric(fnt, 1AX, dx, x, y, w, h, pat[3]);     (*expanded open*)
  74.         eW := dx; eH := h;
  75. END Init;
  76. BEGIN Init
  77. END FoldElems0.
  78.